package com.xqm.poi.excel;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.CellValue;
import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.ss.usermodel.FormulaEvaluator;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFFormulaEvaluator;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.joda.time.DateTime;
import org.junit.Test;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.Date;

/**
 * @author ShiMing
 * @version 1.0
 * @name ExcelReadTest
 * @description TODO
 * @date 2020/8/23
 */

public class ExcelReadTest {

    final String PATH = "G:\\Java\\IDEA\\xqm-poi\\src\\main\\java\\com\\xqm\\poi\\";

    @Test
    public void testRead03() throws IOException {
        // 获取文件流
        FileInputStream fileInputStream = new FileInputStream(PATH + "ExcelRead03.xls");
        // 创建一个工作簿，能使用Excel的所有操作
        Workbook workbook = new HSSFWorkbook(fileInputStream);
        // 通过下标获取，也可以通过名字获取：Sheet getSheet(String var1);
        Sheet sheetAt = workbook.getSheetAt(0);
        // 第一行
        Row row = sheetAt.getRow(0);
        // 第一行第一列，（1，1）
        Cell cell = row.getCell(0);

        // getNumericCellValue 数字
        System.out.println(cell.getNumericCellValue());
        // 注意：数据类型一定要相同，数字就是number，true/false就是boolean，不能使用string。不然会抛出异常：
        // java.lang.IllegalStateException: Cannot get a STRING value from a BOOLEAN cell
        fileInputStream.close();

    }

    @Test
    public void testRead07() throws IOException {
        // 获取文件流
        FileInputStream fileInputStream = new FileInputStream(PATH + "ExcelRead07.xlsx");
        // 创建一个工作簿，能使用Excel的所有操作
        Workbook workbook = new XSSFWorkbook(fileInputStream);
        // 通过下标获取，也可以通过名字获取：Sheet getSheet(String var1);
        Sheet sheetAt = workbook.getSheetAt(0);
        // 第一行
        Row row = sheetAt.getRow(0);
        // 第一行第一列，（1，1）
        Cell cell = row.getCell(0);

        // getNumericCellValue 数字
        System.out.println(cell.getNumericCellValue());
        // 注意：数据类型一定要相同，数字就是number，true/false就是boolean，不能使用string。不然会抛出异常：
        // java.lang.IllegalStateException: Cannot get a STRING value from a BOOLEAN cell
        fileInputStream.close();

    }

    @Test
    public void readType() throws IOException {
        // 获取文件流
        FileInputStream fileInputStream = new FileInputStream(PATH + "ReadType.xlsx");
        // 创建一个工作簿，能使用Excel的所有操作
        Workbook workbook = new XSSFWorkbook(fileInputStream);
        // 通过下标获取，也可以通过名字获取：Sheet getSheet(String var1);
        Sheet sheetAt = workbook.getSheetAt(0);
        // 获取标题
        Row rowTitle = sheetAt.getRow(0);
        int cellCount = 0;
        if (rowTitle != null) {
            // 获取列数
            cellCount = rowTitle.getPhysicalNumberOfCells();
            for (int cellNumber = 0; cellNumber < cellCount; cellNumber++) {
                Cell cell = rowTitle.getCell(cellNumber);
                if (cell != null) {
                    String stringCellValue = cell.getStringCellValue();
                    System.out.print(stringCellValue + " | ");
                }
            }
            System.out.println();
        }

        // 获取表的内容
        // 获取表的行数
        int rowCount = sheetAt.getPhysicalNumberOfRows();
        for (int rowNum = 1; rowNum < rowCount; rowNum++) {
            Row rowData = sheetAt.getRow(rowNum);
            if (rowData != null) {
                for (int cellNumber = 0; cellNumber < cellCount; cellNumber++) {
                    Cell cell = rowData.getCell(cellNumber);
                    if (cell != null) {
                        System.out.print("[" + (rowNum + 1) + "-" + (cellNumber + 1) + "]");
                        CellType cellTypeEnum = cell.getCellTypeEnum();
                        // 匹配列的数据类型
                        String cellValue = "";
                        switch (cellTypeEnum) {
                            // 字符串
                            case STRING:
                                System.out.print("【String】");
                                cellValue = cell.getStringCellValue();
                                break;
                            // 布尔
                            case BOOLEAN:
                                System.out.print("【BOOLEAN】");
                                cellValue = String.valueOf(cell.getBooleanCellValue());
                                break;
                            // 空
                            case BLANK:
                                System.out.print("【BLANK】");
                                break;
                            // 数字
                            case NUMERIC:
                                System.out.print("【NUMERIC】");
                                // 日期
                                if (DateUtil.isCellDateFormatted(cell)) {
                                    System.out.print("【日期】");
                                    Date date = cell.getDateCellValue();
                                    cellValue = new DateTime(date).toString();
                                } else {
                                    // 不是日期格式，防止数字过长
                                    System.out.print("【装换为字符串输出】");
                                    //cell.setCellType(CellType.STRING);
                                    cellValue = cell.toString();
                                }
                                break;
                            case _NONE:
                                System.out.println("【未知数据类型】");
                            case ERROR:
                                System.out.print("【数据类型错误】");
                                break;
                            default:
                                break;
                        }
                        System.out.println(cellValue);
                    }
                }
                System.out.println();
            }
        }
    }

    @Test
    public void formulaTest() throws IOException {
        FileInputStream fileInputStream = new FileInputStream(PATH + "Formula.xlsx");
        // 创建一个工作簿，能使用Excel的所有操作
        Workbook workbook = new XSSFWorkbook(fileInputStream);
        // 通过下标获取，也可以通过名字获取：Sheet getSheet(String var1);
        Sheet sheetAt = workbook.getSheetAt(0);
        // 获取公式
        Row row = sheetAt.getRow(3);
        Cell cell = row.getCell(0);

        // 拿到计算公式

        FormulaEvaluator formulaEvaluator = new XSSFFormulaEvaluator((XSSFWorkbook) workbook);

        // 输入单元格内容
        CellType cellType = cell.getCellTypeEnum();
        switch (cellType) {
            // 公式
            case FORMULA:
                String cellFormula = cell.getCellFormula();
                System.out.println(cellFormula);// SUM(A1:A3)

                CellValue evaluate = formulaEvaluator.evaluate(cell);
                String cellValue = evaluate.formatAsString();
                System.out.println(cellValue); // 1368.0
                break;
            default:
                break;
        }
    }

}
